﻿///
///  Filename:  Stack.cs
///  Author:    Sérgio Severino, nº 9733
///   /*
///      Implementation:  10/06/2012
///   */
///

using System;

namespace KDTreeLib
{
    /// <summary>
    /// A classe que servirá como apontador de memória
    /// </summary>
    public class Stack
    {
        private int[] stack;
        private int top;
        private int max;

        /// <summary>
        /// Construtor
        /// </summary>
        /// <param name="stackSize">O tamanho máximo da stack</param>
        public Stack(int stackSize)
        {
            this.stack = new int[stackSize];
            this.top = -1;
            this.max = stackSize - 1;
        }

        /// <summary>
        /// Metodo para inserir inserir valores na stack
        /// </summary>
        /// <param name="value">Recebe </param>
        /// <returns>false se der erro</returns>
        public bool Push(int value)
        {
            if (!this.IsFull())
            {
                this.top++;
                this.stack[this.top] = value;
                return true;
            }
            else
                return false;
        }

        /// <summary>
        /// Metodo para retirar um valor da stack
        /// </summary>
        /// <returns>O valor retirado</returns>
        public int Pop()
        {
            if (this.IsEmpty())
                return -1;
            else
            {
                this.top = this.top - 1;
                return this.stack[this.top + 1];
            }
        }

        /// <summary>
        /// Metodo para verificar se a stack está cheia
        /// </summary>
        /// <returns>true se a stack estiver cheia</returns>
        public bool IsFull()
        {
            if (this.top >= this.max)
                return true;
            else
                return false;
        }

        /// <summary>
        /// Metodo para verificar se a stack está vazia
        /// </summary>
        /// <returns>true se está vazia</returns>
        public bool IsEmpty()
        {
            if (this.top == -1)
                return true;
            else
                return false;
        }

       

        public override string ToString()
        {
            String s = "";
            s += (this.top + 1).ToString() + ": ";

            for (int k = 0; k <= this.top; k++)
                s += " " + this.stack[k].ToString() + "\n";

            return s;
        }
    }
}
